﻿using DEL.Sys;
using IBLL.Sys;
using System.Collections.Generic;
using System.Linq;

namespace BLL.Sys
{
    public class MenuService : BaseService<Menu>, IMenuService
    { 
        public override void SetCurrentRepository()
        {           
            CurrentRepository = DALFactory.SetMenuRepository();
        }

        /// <summary>
        /// 系统登录后，会在session中记录当前登录用户的信息。
        /// 由于一个用户可以拥有多个角色，我们需要做的是，根据当前登录用户的Id，得到其拥有的所有角色信息，
        /// 然后取当前用户所有角色拥有的功能权限求合集，得到的就是当前登录用户所拥有的功能权限信息。
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public List<Menu> GetMenusByUserId(int userId)
        {
            var allMenus = CurrentRepository.GetEntitysByLambdaAndSort(o => o.Id > 0, o=>o.SortIndex, true).ToList();
            if (userId == 1)   //超级管理员，此处采用了硬编码,获取所有菜单
                return allMenus;

            //根据用户Id获取用户信息
            UserService _us = new UserService();
            var user = _us.GetEntityById(userId);

            //根据用户信息中的roleid获取角色所对应的菜单信息
            //RoleMenuService _rms = new RoleMenuService();
            //var menus = _rms.GetEntitysByLambdaAndSort(o => o.RoleId == user.RoleId, o => o.SortIndex, true);

            //List<int> menuIds = new List<int>();
            RoleMenuService _rms = new RoleMenuService();
            var menuIds = _rms.GetMenuIdsByRoleId(user.RoleId).ToList();            
            var menus = allMenus.Where(it => menuIds.Contains(it.Id)).ToList();
            var tempmenus = allMenus.FindAll(it => it.ParentId == 0);//顶级菜单必须有，否则子菜单不显示
            var result = menus.Union(tempmenus).ToList();

            return result;
        }
              
    }
}
